/*
* GoodsMapper.java
* Copyright(C) initcap
* @date 2018-08-08
*/
package cn.initcap.dao;

import cn.initcap.entity.Goods;
import cn.initcap.entity.SeckillGoods;
import cn.initcap.vo.GoodsVo;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

/**
 * @author initcap
 * @date 2018/8/10 PM5:01
 */
@Mapper
public interface GoodsMapper {
    /**
     * 根据主键删除数据库的记录:goods
     *
     * @param id 编号
     * @return 1 成功
     */
    int deleteByPrimaryKey(Long id);

    /**
     * 新写入数据库记录:goods
     *
     * @param record 数据库对应的实体类
     * @return 1 成功
     */
    int insert(Goods record);

    /**
     * 动态字段,写入数据库记录:goods
     *
     * @param record 数据库对应的实体类
     * @return 1 成功
     */
    int insertSelective(Goods record);

    /**
     * 根据指定主键获取一条数据库记录:goods
     *
     * @param id 编号
     * @return 实体类
     */
    Goods selectByPrimaryKey(Long id);

    /**
     * 动态字段,根据主键来更新符合条件的数据库记录:goods
     *
     * @param record 数据库对应的实体类
     * @return 1 成功
     */
    int updateByPrimaryKeySelective(Goods record);

    /**
     * :goods
     *
     * @param record 数据库对应的实体类
     * @return 1 成功
     */
    int updateByPrimaryKeyWithBLOBs(Goods record);

    /**
     * 查询所有的，配合PageHelper使用分页功能:goods
     *
     * @return 实体类
     */
    List<Goods> selectAll();

    /**
     * 获取所有商品展示
     *
     * @return 展示实体类
     */
    @Select("select g.*,mg.stock_count, mg.start_date, mg.end_date,mg.seckill_price from seckill_goods mg left join goods g on mg.goods_id = g.id")
    List<GoodsVo> listGoodsVo();

    /**
     * 根据商品编号得到商品展示实体类
     *
     * @param goodsId 商品编号
     * @return 展示实体类
     */
    @Select("select g.*,mg.stock_count, mg.start_date, mg.end_date,mg.seckill_price from seckill_goods mg left join goods g on mg.goods_id = g.id where g.id = #{goodsId}")
    GoodsVo getGoodsVoByGoodsId(@Param("goodsId") long goodsId);

    /**
     * 用于减少库存的sql ，使用了stock_count > 0 防止超卖
     *
     * @param g 实体类
     * @return 1 成功
     */
    @Update("update seckill_goods set stock_count = stock_count - 1 where goods_id = #{goodsId} and stock_count > 0")
    int reduceStock(SeckillGoods g);

    /**
     * 减少库存的错误写法，高并发是出现超卖
     *
     * @param g 实体类
     * @return 1 成功
     */
    @Update("update seckill_goods set stock_count = stock_count - 1 where goods_id = #{goodsId}")
    int reduceStockFail(SeckillGoods g);

    /**
     * 重新设置库存
     *
     * @param g 实体类
     * @return 1 成功
     */
    @Update("update seckill_goods set stock_count = #{stockCount} where goods_id = #{goodsId}")
    int resetStock(SeckillGoods g);
}